/*
 * @Author: Xavier 1305433186@qq.com
 * @Date: 2023-03-23
 * @LastEditors: Xavier 1305433186@qq.com
 * @LastEditTime: 2024-08-14 10:27:01
 * @FilePath: \JS32T031_SDK\User\gpio_simulate_uart_V2\gpio_simulate_uart_V2.c
 * @Description: GPIO 虚拟串口
 *
 * STAYTRUE (c) 2022 by ${Xavier}, All Rights Reserved.
 */
#include "gpio_simulate_uart_V2\gpio_simulate_uart_V2.h"

#include "user.h"
#include "main.h"
#include <board.h>
#include "js32t031_system.h"
/****软件串口开始**********************************************/
//********************************************************************
#if PRINTF_LOG

/*!
 * @brief 	模拟串口 GPIO 初始化
 * @param
 * @return	none
 * @note	none
 */
void simulate_uart_io_init(void)
{
	TYPE_LL_GPIO_INIT gpio_struct;
	memset(&gpio_struct, 0x00, sizeof(gpio_struct));
	gpio_struct.gpio_pin = TX_GPIO_PIN;
	gpio_struct.gpio_mode = LL_GPIO_MODE_OUT; // 输出模式
	ll_gpio_init(TX_GPIO_X, &gpio_struct);
}
void uart_send_delay(void)
{
	/*
	 9600，理论值为104
	 19200 ，理论值为52
	 115200，理论值为8.6us
	 230400，理论值为4.34us
	 256000，理论值为3.9us
	*/
	// delay_us(31); // 115200,理论值为8.6us    31*0.17 +3  实测 31
	 delay_us(3); // 256000，理论值为3.9us       3*0.17 +3    实测 3   PA9

//delay_us(5); // 256000，理论值为3.9us       3*0.17 +3    实测 3   PA9
}

/*!
 * @brief 	模拟串口1发送一个字节
 * @param
 * @return	none
 * @note	数据低位在前高位在后
 */
void MUSART1_SendData(unsigned char data_value)
{
#if 1
	unsigned char i = 0;
	// EA = 0;
	__disable_irq();
	TX_L(); //!< 起始位
	uart_send_delay();
	for (i = 0; i < 8; i++)
	{
		if (data_value & 0x01)
		{
			TX_H();
		}
		else
		{
			TX_L();
		}
		uart_send_delay();
		data_value >>= 1;
	}
	TX_H(); //!< 停止位
	uart_send_delay();
	__enable_irq();
	// EA = 1;
#else // 测试延时 函数时间是否准确
	// unsigned char i = 0;
	__disable_irq();
	for (unsigned char i = 0; i < 8; i++)
	{
		TX_L();
		uart_send_delay();
		TX_H();
		uart_send_delay();
	}
	TX_H(); //!< 停止位
	uart_send_delay();
	__enable_irq();
#endif
}
// ————————————————
// 版权声明：本文为CSDN博主「瞅瞅水」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。
// 原文链接：https://blog.csdn.net/FCH112702/article/details/80562566

#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */

#ifdef __cplusplus
extern "C"
{
#endif //__cplusplus

	PUTCHAR_PROTOTYPE
	{
		MUSART1_SendData(ch);
		return (ch);
	}

#ifdef __cplusplus
}
#endif //__cplusplus
#endif
/*****软件串口结束*******************************************************/
